/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.losalpes.compras;

import com.losalpes.client.IClientService;
import com.losalpes.persistence.entity.Cliente;
import com.losalpes.persistence.entity.Compra;
import com.losalpes.persistence.entity.FormaPago;
import com.losalpes.persistence.entity.ItemCompra;
import com.losalpes.persistence.entity.Mueble;
import com.losalpes.persistence.entity.Usuario;
import com.losalpes.security.SecurityBean;
import java.sql.Date;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Juan Ma
 */

public class ComprasBean {

    @EJB
    IComprasService service;
    @EJB
    IClientService clientService;
    private Mueble mueble;
    private String referenciaMueble;
    private int cantidad;
    private List<ItemCompra> carroCompras;
    private int referenciaCompra;


    /** Creates a new instance of ComprasBean */
    public ComprasBean() {
        carroCompras = new ArrayList<ItemCompra>();
    }

    /**
     * Obtiene la lista de muebles disponibles.
     * @return muebles disponibles.
     */
    public List<Mueble> getMueblesDisponibles(){
        return service.getMueblesDisponibles();
    }

    /**
     * Obtiene la referencia del mueble del que se está viendo el detalle.
     * @return referencia del mueble.
     */
    public String getReferenciaMueble() {
        return referenciaMueble;
    }

    /**
     * Modifica la referencia del mueble del que se está viendo el detalle.
     * @param referenciaMueble referencia del mueble
     */
    public void setReferenciaMueble(String referenciaMueble) {
        this.referenciaMueble = referenciaMueble;
    }

    /**
     * Hace la acción para mostrar el detalle del mueble seleccionado por el cliente.
     * @return "detalleMuebleCompra"
     */
    public String verMueble(){
        mueble = service.findMueble(referenciaMueble);
        return "detalleMuebleCompra";
    }

    /**
     * Obtiene el mueble que se tiene en sesión escogido por el cliente.
     * @return Mueble en sesión
     */
    public Mueble getMueble() {
        return mueble;
    }

    /**
     * Modifica el mueble que se tiene en sesión escogido por el cliente.
     * @param mueble Mueble selecionado
     */
    public void setMueble(Mueble mueble) {
        this.mueble = mueble;
    }

    /**
     * Hace el regreso a la pantalla del catálogo de compras
     * @return "catalogoCompras"
     */
    public String regresarACatalogoCompras(){
        return "catalogoCompras";
    }

    /**
     * Hace la navegación de cuando el cliente decide pagar
     * @return "registrarcliente"
     */
    public String efectuarCompra (){
        return "efectuarcompra";
    }

    /**
     * Crea un item de carro de compras y retorna para ir a la página del detalle de carro de compras.
     * @return "carroCompras"
     */
    public String agregarACarroCompras(){
        ItemCompra item = new ItemCompra();
        item.setCantidad(cantidad);
        item.setMueble(mueble);
        item.setPrecioUnitario(mueble.getPrecio());
        this.carroCompras.add(item);
        return "carroCompras";
    }

    /**
     * Obtiene la cantidad escogida por el cliente
     * @return cantidad
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * Modifica la cantidad escogida por el cliente
     * @param cantidad Cantidad seleccionada
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * Obtiene la lista de items de carro de compras que ha escogido el cliente
     * @return lista de items.
     */
    public List<ItemCompra> getCarroCompras() {
        return carroCompras;
    }

    /**
     * Modifica la lista de items de carro de compras que ha escogido el cliente
     * @param carroCompras lista de items
     */
    public void setCarroCompras(List<ItemCompra> carroCompras) {
        this.carroCompras = carroCompras;
    }

    /**
     * obiene el precio total de la compra
     * @return precio de la compra
     */
    public double getPrecioTotalCompra(){
        double res = 0;
        for(ItemCompra item : carroCompras){
            res += item.getCantidad() * item.getMueble().getPrecio();
        }
        return res;
    }

    /**
     * hace la acción para registrar la compra e ir a la página de compra
     * @return "confirmaCompra"
     */
    public String pagar(){
        //referenciaCompra = (int)(Math.random()*1000);
        return "confirmaCompra";
    }

    /**
     * Hace la acción de cuando el cliente confirma la compra
     * @return "resultadoCompra"
     */
    public String confirmoCompra() throws Exception{
        Compra compra = new Compra();
        Usuario user = getSecurityBean().getUsuario();
        Cliente cliente = clientService.findByUsuario(user);
        compra.setCliente(cliente);
        for(ItemCompra item : carroCompras){
            item.setCompra(compra);
        }
        compra.setFecha(new Date(GregorianCalendar.getInstance().getTimeInMillis()));
        compra.setFormaPago(FormaPago.TARJETA_CREDITO);
        compra.setItems(carroCompras);
        service.registrarCompra(compra);
        carroCompras = new ArrayList<ItemCompra>();
        return "resultadoCompra";
    }

    /**
     * obtiene la referencia de la compra
     * @return referencia de la compra
     */
    public int getReferenciaCompra() {
        return referenciaCompra;
    }

    /**
     * modifica la referencia de la compra
     * @param referenciaCompra referencia
     */
    public void setReferenciaCompra(int referenciaCompra) {
        this.referenciaCompra = referenciaCompra;
    }

    private SecurityBean getSecurityBean(){
        FacesContext fc = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);
        SecurityBean sb = (SecurityBean)session.getAttribute("SecurityBean");
        return sb;
    }

}
